package com.bsdsma.fengheguaiapp.service;

import com.bsdsma.fengheguaiapp.dto.UserAddDto;
import com.bsdsma.fengheguaiapp.dto.UserQueryDto;
import com.bsdsma.fengheguaiapp.entity.User;
import com.bsdsma.fengheguaiapp.enums.Role;
import com.bsdsma.fengheguaiapp.dto.PageRetDto;
import com.bsdsma.fengheguaiapp.dto.DataGroupByDateDto;

import java.util.Date;
import java.util.List;

/**
 * 声明对用户表操作的业务接口
 */
public interface UserService {

    /**
     * 用户登录
     *
     * @param username 用户名
     * @param password 密码
     * @return 用户信息
     */
    User login(String username, String password);

    /**
     * 分页查询
     *
     * @param dto   查询条件对象
     * @return      分页数据
     */
    PageRetDto<User> query(UserQueryDto dto);

    /**
     * 声明一个添加用户的接口
     * @param dto   添加的对象数据
     * @return      添加后的用户实体
     */
    User add(UserAddDto dto);

    /**
     * 用户修改
     * @param id    主键ID
     * @param dto   修改数据
     * @return
     */
    User update(Long id, UserAddDto dto);

    /**
     * 注册/登录的时候，都需要查一下这个账号是不是已经存在数据库中了
     * @param account   账号
     * @return          查询到的用户对象
     */
    User getByAccount(String account);

    /**
     * 通过手机号查询
     * @param cellphoneNumber   手机号
     * @return                  查询到的用户对象
     */
    User getByCellphoneNumber(String cellphoneNumber);

    /**
     * 通过ID查询
     * @param id    主键
     * @return      查询到的用户对象
     */
    User getById(Long id);

    /**
     * 通过角色查询所有用户
     * @param role  角色
     * @return      查询到的所有用户
     */
    List<User> listByRole(Role role);

    /**
     * 随机获取一个用户
     * @param role  角色
     * @return      查询到某个随机用户
     */
    User getRandomOneByRole(Role role);

    /**
     * 删除用户
     * @param id    用户ID
     */
    void delete(Long id);

    int updateById(User entity);

    Long count();

    /**
     * 按日期分组查询新增数量
     * @param beginDate 开始时间
     * @param endDate   结束时间
     * @return
     */
    List<DataGroupByDateDto> countByDay(Date beginDate, Date endDate);
}
